// 导入模块
import Request from 'luch-request'

import { useUserStore } from '@/stores/user.js'

// tabBar页面路径
const tabBarList = [
  'pages/index/index',
  'pages/wiki/index',
  'pages/notify/index',
  'pages/my/index',
]

// 接口白名单
const whiteList = ['/code', '/login', '/login/password']
// 实例化网络请求
const http = new Request({
  // 接口基地址
  baseURL: 'https://consult-api.itheima.net',
  custom: {
    loading: true,
  },
})

// 配置请求拦截器
http.interceptors.request.use((config) => {
  // config ji请求时的参数,包含请求头
  // 如果局部将custom.loading赋值为false 则不显示loading
  if (config.custom.loading) {
    // 显示加载
    uni.showLoading({
      title: '正在加载...',
    })
  }

  // 获取token
  const userStore = useUserStore()

  // 默认的请求头
  const defaultHeader = {}

  // 判断是否存在token  已经登录需要请求头的加上token
  // 判断是否存在 token 并且不在接口白单当中
  if (userStore.token && !whiteList.includes(config.url)) {
    defaultHeader.Authorization = 'Bearer ' + userStore.token
  }

  // console.log(config);
  config.header = {
    ...defaultHeader,
    // Authorization: '11111111',
    // 让局部的头信息覆盖掉全局的信息
    ...config.header,
  }
  return config
})

// 响应拦截器
http.interceptors.response.use(
  ({ data, statusCode }) => {
    // console.log(res);
    // 关闭加载提示
    uni.hideLoading()
    // 将接口返回的数据返回
    return data
  },
  function (error) {
    // 关闭加载提示
    uni.hideLoading()
	// 请求错误 直接跳转到登录页
    if (error.statusCode === 401) reLogin()
    return Promise.reject(error)
  }
)

// 重新登录
function reLogin() {
  // 动态读取当前页面的路径
  const pageStack = getCurrentPages()
  console.log(pageStack, 'pageStack')
  const currentPage = pageStack[pageStack.length - 1]
  console.log(currentPage, 'currentPage')
  // 完整的路由（包含地址中的参数）
  const redirectURL = currentPage.$page.fullPath
  // 是否为 tabBar 中定义的路径
  const openType = tabBarList.includes(currentPage.route)
    ? 'switchTab'
    : 'redirectTo'
  // 用户相关数据
  const userStore = useUserStore()

  // 将来再跳转回这个页面
  userStore.recirectURL = redirectURL
  // 页面（路由）跳转方式
  userStore.openType = openType

  uni.redirectTo({
    url: '/pages/login/index',
  })
}
// 导出配置好的模网络模块
export { http }
